package com.liangtian.mdm.base.utils;


import com.liangtian.mdm.system.parameter.utils.SysParamUtil;

import java.io.*;

public class PlatForm {

    public static String getAbsolutePath() {
        try {
            String path = PlatForm.class.getProtectionDomain().getCodeSource()
                    .getLocation().getPath();  //获取这个类编译后的路径
            int position = path.indexOf("WEB-INF/");
            //这里再一次判断，是在weblogic下测试的时候，发现没有带webroot这个路径
            if (position != -1) {
                path = path.substring(0, position);//获取webroot路径
            }
            return path;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 主要是二次开发的页面(针对万达二次开发功能)
     * 复制文件  从源文件复制到新的文件夹下面
     * @param sourceFile
     * @param newFile
     */
//	public static void copySecondaryFile(String sourceFileUrl,String tableName,String modelType,String classType,String createType){
//		String newFileUrl="";
//		String prjectUrl=PlatForm.getAbsolutePath();   //项目webroot所在地址
//		if("JS".equals(createType)){
//			newFileUrl=prjectUrl+"secondary/wanda/"+tableName+"/js/";  //新js文件的存放地址   webroot/am/AM_T001/js/
//		}
//        (new File(newFileUrl)).mkdirs();  //创建目标文件夹
//        File[] file = (new File(sourceFileUrl)).listFiles(); //获取源文件夹当前下的文件或目录
//        for (int i = 0; i < file.length; i++) {
//            if (file[i].isFile()) {
//                if(PlatForm.getFileByType(PlatForm.splitFileName(file[i].getName()), modelType,classType)){  //不符合条件的页面不创建
//                	continue;
//                }else{
//                	copyFile(file[i], new File(newFileUrl + tableName + "_" + file[i].getName().split("_")[1])); //新文件的路径+文件名
//                }
//            }
//        }
//	}

    /**
     * 复制文件  从源文件复制到新的文件夹下面
     *
     */
    public static void copyFile(String sourceFileUrl, String tableName, String modelType, String classType, String createType) {
        String newFileUrl = "";
        String prjectUrl = PlatForm.getAbsolutePath();   //项目webroot所在地址
        if ("JS".equals(createType)) {
            newFileUrl = prjectUrl + "am/" + tableName + "/js/";  //新js文件的存放地址   webroot/am/AM_T001/js/
        } else {
            newFileUrl = prjectUrl + "am/" + tableName + "/";  //新文件的存放地址   webroot/am/AM_T001/
        }

        (new File(newFileUrl)).mkdirs();  //创建目标文件夹

        File[] file = (new File(sourceFileUrl)).listFiles(); //获取源文件夹当前下的文件或目录
        for (int i = 0; i < file.length; i++) {
            if (file[i].isFile()) {
                if (PlatForm.getFileByType(PlatForm.splitFileName(file[i].getName()), modelType, classType)) {  //不符合条件的页面不创建
                    continue;
                } else {
                    //--判断/dm/jsp/secondary/当前项目/当前主数据/当前fileName下是否存在定制化开发逻辑，如果有，使用定制化模板，否则使用默认模板
                    String systemCode = SysParamUtil.getParameterValue("systemCode", "MDM");
                    String secondaryFilePath = PlatForm.getAbsolutePath() + "dm/jsp/secondary/" + systemCode + "/" + tableName + "/";
                    if ("JS".equals(createType)) {
                        secondaryFilePath += "js/" + file[i].getName();
                    } else {
                        secondaryFilePath += file[i].getName();
                    }
                    File secondaryFile = new File(secondaryFilePath);
                    if (secondaryFile.exists()) {
                        copyFile(secondaryFile, new File(newFileUrl + tableName + "_" + file[i].getName().split("_")[1])); //新文件的路径+文件名
                    } else {
                        copyFile(file[i], new File(newFileUrl + tableName + "_" + file[i].getName().split("_")[1])); //新文件的路径+文件名
                    }
                }
            }
        }
//        if("JS".equals(createType)){
//        	System.exit(0);
//        }
    }

    /**
     * 复制文件  从源文件复制到新的文件夹下面
     *
     * @param sourceFile
     * @param newFile
     */
    public static void copyPopFile(String sourceFileUrl, String tableName, String columnName, String createType) {
        String newFileUrl = "";
        String prjectUrl = PlatForm.getAbsolutePath();   //项目webroot所在地址
        if ("JS".equals(createType)) {
            newFileUrl = prjectUrl + "am/" + tableName + "/js/";  //新js文件的存放地址   webroot/am/AM_T001/js/
        } else {
            newFileUrl = prjectUrl + "am/" + tableName + "/";  //新文件的存放地址   webroot/am/AM_T001/
        }

        (new File(newFileUrl)).mkdirs();  //创建目标文件夹

        File[] file = (new File(sourceFileUrl)).listFiles(); //获取源文件夹当前下的文件或目录
        for (int i = 0; i < file.length; i++) {
            if (file[i].isFile()) {
                if (file[i].getName().split("_")[1].contains("bg"))
                    copyFile(file[i], new File(newFileUrl + tableName + "_" + file[i].getName().split("_")[1]));
                else
                    copyFile(file[i], new File(newFileUrl + tableName + "_" + columnName + file[i].getName().split("_")[1])); //新文件的路径+文件名
            }
        }
    }


    /**
     * * <p>Title: 弹出的树模型生成路径</p>
     * <p>Company:@param sourceFileUrl
     * <p>Company:@param tableName
     * <p>Company:@param columnName
     * <p>Company:@param createType
     * <p>Company:@throws IOException </p>
     *
     * @author : xiaoliu
     * @date :2016年8月10日上午9:09:59
     */
    public static void copyTreeFile(String sourceFileUrl, String tableName, String columnName, String createType) {
        String newFileUrl = "";
        String prjectUrl = PlatForm.getAbsolutePath();   //项目webroot所在地址
        if ("JS".equals(createType)) {
            newFileUrl = prjectUrl + "am/" + tableName + "/js/";  //新js文件的存放地址   webroot/am/AM_T001/js/
        } else {
            newFileUrl = prjectUrl + "am/" + tableName + "/";  //新文件的存放地址   webroot/am/AM_T001/
        }

        (new File(newFileUrl)).mkdirs();  //创建目标文件夹

        File[] file = (new File(sourceFileUrl)).listFiles(); //获取源文件夹当前下的文件或目录
        for (int i = 0; i < file.length; i++) {
            if (file[i].isFile()) {
                copyFile(file[i], new File(newFileUrl + tableName + "_" + columnName + file[i].getName().split("_")[1])); //新文件的路径+文件名
            }
        }
    }

    /**
     * 拆分文件名，将temple_add.jsp拆分为add
     *
     * @param fileName
     * @return
     */
    private static String splitFileName(String fileName) {
        String fileNameSplit = fileName.split("_")[1];//temple_add.jsp  拆分为add.jsp
        String tmpType = fileNameSplit.substring(0, fileNameSplit.indexOf("."));
        return tmpType;
    }

    /**
     * 根据模型类型判断生成几个页面
     *
     * @param fileName
     * @param modelType
     * @return
     */
    private static boolean getFileByType(String fileNameType, String modelType, String classType) {
        boolean flag = false;
        // 数据类型【0-列表、1-父子树、2-分类树】
        if ("1".equals(modelType) && "0".equals(classType)) {  //字典表类型的列表  只创建查询  申请  维护页面
            if (fileNameType.equals("update")) {  //修改页面
                flag = true;
            } else if (fileNameType.equals("approve")) { //审核页面
                flag = true;
            } else if (fileNameType.equals("updateEdit")) { //修改页面的编辑页面
                flag = true;
            } else if (fileNameType.equals("list")) { //主数据类型的查询页面
                flag = true;
            } else if (fileNameType.equals("updateHis")) { //主数据类型的查看变更历史页面
                flag = true;
            }
        } else if ("1".equals(modelType) && ("1".equals(classType) || "2".equals(classType))) { //字典类型的父子树和分类树
            if (fileNameType.equals("treeTabUpdate")) {  //修改页面
                flag = true;
            } else if (fileNameType.equals("treeTabSh")) { //审核页面
                flag = true;
            } else if (fileNameType.equals("treeTabUpdateEdit")) { //修改页面的编辑页面
                flag = true;
            } else if (fileNameType.equals("treeTabList")) { //主数据类型的查询页面
                flag = true;
            } else if (fileNameType.equals("treeTabUpdateHis")) { //主数据类型的查看变更历史页面
                flag = true;
            }
        } else if ("0".equals(modelType) && "0".equals(classType)) {  //主数据类型 的列表 只创建查询  申请 审核  修改
            if (fileNameType.equals("wh")) {  //维护页面
                flag = true;
            } else if (fileNameType.equals("zdList")) { //字典类型的查询页面
                flag = true;
            }
        } else if ("0".equals(modelType) && ("1".equals(classType) || "2".equals(classType))) {  //主数据树类型的父子树和分类树  只创建查询  申请 审核  修改
            if (fileNameType.equals("treeTabWh")) {  //维护页面
                flag = true;
            } else if (fileNameType.equals("treeTabZdList")) { //字典类型的查询页面
                flag = true;
            }
        }
        return flag;
    }

    // 复制文件
    public static void copyFile(File sourceFile, File targetFile) {
        BufferedInputStream inBuff = null;
        BufferedOutputStream outBuff = null;
        try {
            try {
                // 新建文件输入流并对它进行缓冲
                inBuff = new BufferedInputStream(new FileInputStream(sourceFile));

                // 新建文件输出流并对它进行缓冲
                outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));

                // 缓冲数组
                byte[] b = new byte[1024*5];
                int len;
                while ((len = inBuff.read(b)) != -1) {
                    outBuff.write(b, 0, len);
                }
                // 刷新此缓冲的输出流
                outBuff.flush();
            } finally {
                // 关闭流
                if (inBuff != null)
                    inBuff.close();
                if (outBuff != null)
                    outBuff.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("创建文件失败！");
        }
    }

    // 复制文件夹
    public static void copyDirectiory(String sourceDir, String targetDir) throws IOException {
        // 新建目标目录
        (new File(targetDir)).mkdirs();
        // 获取源文件夹当前下的文件或目录
        File[] file = (new File(sourceDir)).listFiles();
        for (int i = 0; i < file.length; i++) {
            if (file[i].isFile()) {
                // 源文件
                File sourceFile = file[i];
                // 目标文件
                File targetFile = new File(new File(targetDir).getAbsolutePath() + File.separator + file[i].getName());
                copyFile(sourceFile, targetFile);
            }
            if (file[i].isDirectory()) {
                // 准备复制的源文件夹
                String dir1 = sourceDir + "/" + file[i].getName();
                // 准备复制的目标文件夹
                String dir2 = targetDir + "/" + file[i].getName();
                copyDirectiory(dir1, dir2);
            }
        }
    }
}
